#ifndef __M_LOGGER_H__
#define __M_LOGGER_H__
#include <stdio.h>
#include <cstdio>
#include <time.h>
#include <string>
#include <pthread.h>
#include <sys/types.h>
#include <unistd.h>

/*

    改日志支持格式化打印 或者直接字符串打印
*/
// 其中format是我们消息的格式 __VA_ARGS__是传进来的参数
/*
[可读性很好的时间] [⽇志等级] [进程pid] [打印对应⽇志的⽂件名][⾏号] - 消息内容，⽀持可变参数
[2024-08-04 12:27:03] [DEBUG] [202938] [main.cc] [16] - hello world
[2024-08-04 12:27:03] [DEBUG] [202938] [main.cc] [17] - hello world
[2024-08-04 12:27:03] [DEBUG] [202938] [main.cc] [18] - hello world
[2024-08-04 12:27:03] [DEBUG] [202938] [main.cc] [20] - hello world
[2024-08-04 12:27:03] [DEBUG] [202938] [main.cc] [21] - hello world
[2024-08-04 12:27:03] [WARNING] [202938] [main.cc] [23] - hello world


##__VA_ARGS__ 可以没有处理没有多个参数的情况 在这里如果我们传入的没有格式化字符串 而是一个文本字符串 此时我们消息内容就是format
va_args_替换则啥都没有了
*/

#define INF 0
#define DBG 1
#define ERR 2
#define LOG_LEVEL INF
std::string getlevle(int le)
{
    if (le == 0)
        return "INF";
    else if (le == 1)
        return "DBG";
    else if (le == 2)
        return "LOG";
    else
        return "none";
}
#define LOG(level, format, ...)                                                                                                      \
    do                                                                                                                               \
    {                                                                                                                                \
        if (level < LOG_LEVEL)                                                                                                       \
            break;                                                                                                                   \
        char *strlevel = (char *)getlevle(level).c_str();                                                                            \
        time_t t = time(nullptr);                                                                                                    \
        struct tm *ltm = localtime(&t);                                                                                              \
        char tmp[64] = {0};                                                                                                          \
        strftime(tmp, 63, "%Y-%m-%d %H:%M:%S", ltm); /*按照指定格式把strurct tm的时间信息格式化到缓冲区*/                            \
        fprintf(stdout, "[%s] [%s] [%d] [%s] [%d] - " format "\n", tmp, strlevel, (int)getpid(), __FILE__, __LINE__, ##__VA_ARGS__); \
    } while (0)

#define INF_LOG(format, ...) LOG(INF, format, ##__VA_ARGS__)
#define DBG_LOG(format, ...) LOG(DBG, format, ##__VA_ARGS__)
#define ERR_LOG(format, ...) LOG(ERR, format, ##__VA_ARGS__)
#endif
